package com.atguigu.crowd.mvc.handler;

import com.atguigu.crowd.constant.CrowdConstant;
import com.atguigu.crowd.entity.Admin;
import com.atguigu.crowd.service.api.AdminService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 管理员Handler
 *
 * @author cyb315
 * @create 2021-10-17 20:40
 */
@Controller
public class AdminHandler {

    // 装配AdminService对象
    @Autowired
    private AdminService adminService;

    /**
     * 测试用控制器方法
     *
     * @return
     */
    @RequestMapping("/test/ssm.html")
    public ModelAndView getAllHandler() {
        ModelAndView modelAndView = new ModelAndView();
        List<Admin> adminList = adminService.getAllAdmin();
        modelAndView.addObject("allAdmin", adminList);
        modelAndView.setViewName("success");
        //测试异常映射
        int i = 12 / 0;
//        String s=null;
//        System.out.println(s.length());
        return modelAndView;
    }

    /**
     * 管理员登录控制器方法
     *
     * @param loginAcct 登录账号
     * @param userPswd  登录密码
     * @param session   HttpSession对象
     * @return
     */
    @RequestMapping("/admin/do/login.html")
    public String doLogin(
            @RequestParam("loginAcct") String loginAcct,
            @RequestParam("userPswd") String userPswd,
            HttpSession session
    ) {

        // 1.调用Service方法执行登录检查，如果能够返回admin对象说明登录成功；如果账号，密码不正确则会在service层抛出异常
        Admin admin = adminService.getAdminByLoginAcct(loginAcct, userPswd);

        // 2.将登录成功后返回的admin对象存入session域
        session.setAttribute(CrowdConstant.ATTR_NAME_LOGIN_ADMIN, admin);

        // 3.重定向到管理员主页面
        return "redirect:/admin/to/main/page.html";
    }

    /**
     * 管理员退出登录控制方法
     *
     * @param session HttpSession对象
     * @return
     */
    @RequestMapping("/admin/do/logout.html")
    public String doLogout(HttpSession session) {

        // 1.强制让session对象过期失效
        session.invalidate();

        // 2.重定向到登录页面
        return "redirect:/admin/to/login/page.html";
    }

    /**
     * 分页查询管理员信息的控制方法（可带关键字查询）
     *
     * @param keyword  关键字
     * @param pageNum  当前要查询的页码
     * @param pageSize 每页条目数
     * @param modelMap
     * @return
     */
    @RequestMapping("/admin/get/page.html")
    public String getAdminPage(
            @RequestParam(value = "keyword", defaultValue = "") String keyword,
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
            @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
            ModelMap modelMap
    ) {
        // 1.查询得到分页数据
        PageInfo<Admin> pageInfo = adminService.getAdminPage(keyword, pageNum, pageSize);
        // 2.将分页数据保存到request域
        modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);
        // 3.转发到管理员列表页面
        return "admin-page";
    }

    /**
     * 根据管理员id删除单个管理员信息的控制方法
     *
     * @param adminId 管理员id
     * @param pageNum 当前页码数
     * @param keyword 当前搜索关键词
     * @return
     */
    @RequestMapping("/admin/remove/{adminId}/{pageNum}/{keyword}.html")
    public String removeOneAdmin(
            @PathVariable("adminId") Integer adminId,
            @PathVariable("pageNum") Integer pageNum,
            @PathVariable("keyword") String keyword
    ) {

        adminService.removeAdmin(adminId);
        // 重定向到删除后的分页页面，并保持原查询条件
        return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
    }

    /**
     * 新增管理员信息的控制方法
     *
     * @param admin 前端页面封装成的Admin对象
     * @return
     */
    @PreAuthorize("hasAuthority('user:save')")
    @RequestMapping("/admin/save.html")
    public String saveAdmin(Admin admin) {

        adminService.saveAdmin(admin);

        return "redirect:/admin/get/page.html?pageNum=" + Integer.MAX_VALUE;
    }

    /**
     * 更新管理员信息时回显用户信息的请求映射方法
     *
     * @param adminId  管理员id
     * @param modelMap
     * @return
     */
    @RequestMapping("/admin/to/edit/page.html")
    public String toEditPage(
            @RequestParam("adminId") Integer adminId,
            ModelMap modelMap
    ) {
        Admin admin = adminService.getAdminById(adminId);
        modelMap.addAttribute("admin", admin);
        return "admin-edit";
    }

    /**
     * 更新管理员信息的请求映射控制方法
     *
     * @param admin
     * @param pageNum
     * @param keyword
     * @return
     */
    @RequestMapping("/admin/update.html")
    public String updateAdmin(Admin admin, @RequestParam("pageNum") Integer pageNum, @RequestParam("keyword") String keyword) {
        adminService.updateAdmin(admin);
        return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
    }


}
